/*
 * @(#)XfvhdlDefuzzificationFactory.java        3.0           2004/09/14
 *
 * This file is part of Xfuzzy 3.0, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfvhdl;

/**
* Clase que hace de factoria para los defuzzificadores.
* @author Jos� Mar�a �vila Maireles, <b>e-mail</b>: josavimai@alum.us.es
* @version 3.0
*/
public class XfvhdlDefuzzificationFactory
   implements XfvhdlIFactoryDefuzzification {

   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   //		ATRIBUTOS PRIVADOS DE LA CLASE 				            
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//

   // El atributo instance me limitar� a que s�lo pueda construir una 
   // f�brica.
   private static XfvhdlDefuzzificationFactory instance = null;

   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   //			  CONSTRUCTOR DE LA CLASE					 	   
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//	
   /**
   * M�todo construtor de la clase. Es privado porque estoy usando el 
   * patron Singleton.
   */
   private XfvhdlDefuzzificationFactory() {
   }

   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   //			  M�TO_DOS P�BLICOS DE LA CLASE				       
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
   /**
   * M�todo que crea un y solo un objeto de la clase.
   * @return Devuelve una factoria de defuzzificadores.
   */
   public static XfvhdlDefuzzificationFactory getInstance() {
      if (instance == null) {
         instance = new XfvhdlDefuzzificationFactory();
      }
      return instance;
   }

   // Implemento los m�todos de la interfaz IFactoryDefuzzification:
   /**
   * M�todo que crea el defuzzificador por defecto.
   * @return Devuelve un defuzzificador que implementa la interfaz 
   * IDefuzzification.
   */
   public XfvhdlIDefuzzification create() {
      return create("FuzzyMean");
   }

   /**
   * M�todo que crea un defuzzificador u otro dependiendo de la cadena 
   * que le pasen con el nombre del defuzzificador deseado.
   * ESTE ES EL METO_DO QUE HAY QUE MODIFICAR CUANDO SE A�ADA UN NUEVO
   * M�TO_DO DE DEFUZZIFICACION.
   * @param method es el nombre del defuzzificador deseado.
   * @return Devuelve la cadena que ser� escrita en fichero 
   * Constants.vhdl.
   */
   public XfvhdlIDefuzzification create(String method) {
      XfvhdlIDefuzzification deffuz;

      if (method.equalsIgnoreCase("WeightedFuzzyMean")) {
         deffuz = new XfvhdlWeightedFuzzyMeanDefuzzificationMethod();
      } else if (method.equalsIgnoreCase("FuzzyMean")) {
         deffuz = new XfvhdlFuzzyMeanDefuzzificationMethod();
      } else { // Por defecto se crea un FirstSimpliedMethod.
         XfvhdlError err = new XfvhdlError();
         err.newWarning(29);
         deffuz = new XfvhdlFuzzyMeanDefuzzificationMethod();
      }
      return deffuz;
   }

} // Fin de la clase
